/*     */ package com.zimbra.cs.store;
/*     */ 
/*     */ import com.zimbra.common.stats.Counter;
/*     */ import com.zimbra.cs.stats.ZimbraPerf;
/*     */ import java.io.File;
/*     */ import java.io.IOException;
/*     */ import java.io.RandomAccessFile;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class SharedFile
/*     */ {
/*     */   private File mFile;
/*     */   private RandomAccessFile mRAF;
/*  36 */   private long mPos = 0L;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private int mNumReaders;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private long mLength;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   SharedFile(File file)
/*     */     throws IOException
/*     */   {
/*  57 */     if (file == null) {
/*  58 */       throw new NullPointerException("file cannot be null");
/*     */     }
/*  60 */     if (!file.exists()) {
/*  61 */       throw new IOException(file.getPath() + " does not exist.");
/*     */     }
/*  63 */     this.mFile = file;
/*  64 */     this.mLength = file.length();
/*  65 */     openIfNecessary();
/*     */   }
/*     */   
/*     */   synchronized long getLength() {
/*  69 */     return this.mLength;
/*     */   }
/*     */   
/*     */   synchronized int read(long fileOffset, byte[] b, int off, int len) throws IOException
/*     */   {
/*  74 */     int numRead = 0;
/*  75 */     boolean seeked = false;
/*  76 */     openIfNecessary();
/*     */     
/*  78 */     if (this.mPos != fileOffset) {
/*  79 */       this.mRAF.seek(fileOffset);
/*  80 */       this.mPos = fileOffset;
/*  81 */       seeked = true;
/*     */     }
/*  83 */     numRead = this.mRAF.read(b, off, len);
/*  84 */     this.mPos += numRead;
/*     */     
/*  86 */     if (seeked) {
/*  87 */       ZimbraPerf.COUNTER_BLOB_INPUT_STREAM_SEEK_RATE.increment(100L);
/*     */     } else {
/*  89 */       ZimbraPerf.COUNTER_BLOB_INPUT_STREAM_SEEK_RATE.increment(0L);
/*     */     }
/*  91 */     ZimbraPerf.COUNTER_BLOB_INPUT_STREAM_READ.increment();
/*  92 */     return numRead;
/*     */   }
/*     */   
/*     */   synchronized void aboutToRead() {
/*  96 */     this.mNumReaders += 1;
/*     */   }
/*     */   
/*     */   synchronized void doneReading() {
/* 100 */     if (this.mNumReaders > 0) {
/* 101 */       this.mNumReaders -= 1;
/*     */     }
/*     */   }
/*     */   
/*     */   synchronized int getNumReaders() {
/* 106 */     return this.mNumReaders;
/*     */   }
/*     */   
/*     */   private synchronized void openIfNecessary() throws IOException
/*     */   {
/* 111 */     if (this.mRAF == null) {
/* 112 */       if (!this.mFile.exists()) {
/* 113 */         throw new IOException(this.mFile.getPath() + " does not exist.");
/*     */       }
/* 115 */       this.mRAF = new RandomAccessFile(this.mFile, "r");
/* 116 */       this.mPos = 0L;
/*     */     }
/*     */   }
/*     */   
/*     */   synchronized void close() throws IOException
/*     */   {
/* 122 */     if (this.mRAF != null) {
/* 123 */       this.mRAF.close();
/* 124 */       this.mPos = 0L;
/* 125 */       this.mRAF = null;
/*     */     }
/*     */   }
/*     */   
/*     */   public String toString() {
/* 130 */     return this.mFile.toString();
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/store/SharedFile.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */